//
// Created by 尚衍硕 on 18/9/26.
// https://my.oschina.net/u/2368542/blog/2208691
// https://blog.csdn.net/skillart/article/details/52336303
//
#include <gtest/gtest.h>
#include <functional>
#include <iostream>
#include <string>
using namespace std;
//using std::function;

/****************************************************************************/
/*  下面分别给出使用function来包装普通函数，函数对象和类的成员函数的参考代码           */
/*  介绍：类模版std::function是一种通用、多态的函数封装。                          */
/*  通常std::function是一个函数对象类，它包装其它任意的函数对象                     */
/*
 * 也就是说，通过std::function对C++中各种可调用实体（普通函数、Lambda表达式、函数指针、
 * 以及其它函数对象等）的封装，形成一个新的可调用的std::function对象；让我们不再纠结那么多
 * 的可调用实体。一切变的简单粗暴。
 */
/****************************************************************************/
int AddXY(int x, int y)
{
    return x+y;
}

int normalFunctionObject()
{
    function<int (int,int)> f = AddXY;
    int z = f(2, 3);
    return z;
}
/****************************************************************************/
class CStudent
{
public:
    void operator() (string strName, int nAge)
    {
        cout << strName << " : " << nAge << endl;
    }
};

bool functionObject()
{
    CStudent stu;
    function<void (string, int)> f = stu;
    f("Mike",  12);
    return true;
}
/****************************************************************************/


/****************************************************************************/

TEST(functionObjectTest,test0){
    ASSERT_EQ(5,normalFunctionObject());
}

TEST(functionObjectTest,test1){
    ASSERT_TRUE(functionObject());
}